import numpy as np

a = np.arange(8)
print(a)

a = a.reshape(4, 2)
print(a)

a = np.arange(9).reshape(3, 3)
for row in a:
    print(row)

# numpy.ndarray.flat 是一个数组元素迭代器
for element in a.flat:
    print(element)

a = np.arange(8).reshape(2, 4)
print(a)

# numpy.ndarray.flatten 返回一份数组拷贝，对拷贝所做的修改不会影响原始数组
# order：'C' -- 按行，'F' -- 按列，'A' -- 原顺序，'K' -- 元素在内存中的出现顺序。
print(a.flatten())

print(a.flatten(order='F'))

# numpy.ravel() 展平的数组元素，顺序通常是"C风格"，返回的是数组视图（view，有点类似 C/C++引用reference的意味），修改会影响原始数组。
a.ravel()
print(a)
print(a.ravel())
print(a.ravel(order='F'))

a = np.arange(12).reshape(3, 4)
print(a)
# numpy.transpose 函数用于对换数组的维度
a = np.transpose(a)
print(a.shape)
# numpy.ndarray.T 类似 numpy.transpose：
a = a.T
print(a.shape)

a = np.arange(8).reshape(2, 2, 2)
print(a)
print(np.where(a == 6))
print(a[1, 1, 0])

b = np.rollaxis(a, 2, 0)
print(b)

a = np.arange(8).reshape(2, 2, 2)
print(a)
# numpy.swapaxes 函数用于交换数组的两个轴
a = np.swapaxes(a, 2, 0)
print(a)

a = np.arange(9).reshape(1, 3, 3)
# numpy.squeeze 函数从给定数组的形状中删除一维的条目
b = np.squeeze(a)
print(a.shape, b.shape)

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# 沿轴 0 连接两个数组
print(np.concatenate((a, b)))
# 沿轴 1 连接两个数组
print(np.concatenate((a, b), axis=1))

# 水平堆叠来生成数组
c = np.hstack((a, b))
print(c)
# 垂直堆叠来生成数组
c = np.vstack((a, b))
print(c)

a = np.arange(9)
print(a)
b = np.split(a, 3)
print(b)
b = np.split(a, [3, 6])
print(b)

a = np.arange(16).reshape(4, 4)
print(a)
b = np.split(a, 2)
print(b)
b = np.split(a, 2, 1)
print(b)
# numpy.hsplit 函数用于水平分割数组
b = np.hsplit(a, 2)
print(b)
# numpy.vsplit 沿着垂直轴分割
b = np.vsplit(a, 2)
print(b)

# 如果新数组大小大于原始大小，则包含原始数组中的元素的副本。
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
b = np.resize(a, (3, 2))
print(b.shape)
b = np.resize(a, (4, 4))
print(b)

# numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组，并把原来的数组复制到新数组中。 此外，输入数组的维度必须匹配否则将生成ValueError。
# append 函数返回的始终是一个一维数组。
a = np.array([[1, 2, 3], [4, 5, 6]])
print(a)
print(np.append(a, [7, 8, 9]))
print(np.append(a, [[7, 8, 9]], axis=0))
print(np.append(a, [[5, 5, 5], [7, 8, 9]], axis=1))
